#include <iostream>
using namespace std;

int main()
{
    // [n]：按值捕获（拷贝），但 lambda 的调用运算符默认带 const
    // [&n]：按引用捕获（别名）
    // [=]：按值捕获所有外部变量
    // [&]：按引用捕获所有外部变量
    // [x, &y] // x以传值方式传入（默认），y以引用方式传入。
    // [&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
    // [=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
    int n{3};
    int m{3};
    auto fn = [&n, m]() -> void
    {
        // 此处修改会影响原始值
        n++;
        // const 无法修改
        // m++;
    };
    fn();
    auto bar = [=]() -> void
    {
        cout << "bar's n is " << n << endl;
        cout << "bar's m is " << m << endl;
    };
    bar();
    auto gkd = [&]() -> void
    {
        cout << "bar's n is " << n++ << endl;
        cout << "bar's m is " << m++ << endl;
    };
    gkd();
    cout << n << endl;
    cout << m << endl;
    return 0;
}
